esp32 您所在的位置:网站首页 esp32 p2p方案 esp32

esp32

#esp32| 来源: 网络整理| 查看: 265

事件组(Event Group)是 ESP32 IDF 中一种高效而灵活的同步和通信机制。事件组中的每个位都代表一个事件标识符,当一个或多个事件被触发时,对应的位将被设置。事件组允许多个线程/任务等待多个事件的发生,从而实现任务的协调和同步。

在 ESP32 IDF 中,事件组由 EventGroupHandle_t 类型表示,代表事件组的句柄。下面是一些常用的事件组 API 函数:

1. xEventGroupCreate() 用于创建一个事件组。函数原型如下:  

EventGroupHandle_t xEventGroupCreate( void );

2. xEventGroupWaitBits() 用于等待一个或多个事件的发生,并在条件满足时结束等待。函数原型如下:  

EventBits_t xEventGroupWaitBits(EventGroupHandle_t xEventGroup, EventBits_t uxBitsToWaitFor, BaseType_t xClearOnExit, BaseType_t xWaitForAllBits, TickType_t xTicksToWait);

3. xEventGroupSetBits() 用于设置一组事件。函数原型如下:

EventBits_t xEventGroupSetBits(EventGroupHandle_t xEventGroup, EventBits_t uxBitsToSet);

4. xEventGroupClearBits() 用于清除事件组中的指定位。函数原型如下:

EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup, EventBits_t uxBitsToClear);

5. xEventGroupGetBits() 获取事件组的当前状态。函数原型如下:

EventBits_t xEventGroupGetBits(EventGroupHandle_t xEventGroup);

通过使用这些 API 函数,可以实现非常高效和灵活的事件处理功能。例如,可以使用事件组来实现多任务编程,其中每个任务等待一个或多个事件的发生,同时其他线程/任务可以设置和清除这些事件。这使得代码更加结构化和可读,并可以有效提高程序的性能和可靠性。

下面是一个简单的示例,演示如何使用事件组来实现两个任务之间的同步和通信。

在示例代码中,我们将创建两个任务:sender_task 和 receiver_task。sender_task 不断将数字发送到事件组,receiver_task 等待事件组中的数字并进行处理。当事件组接收到指定数字时,receiver_task 将输出一条消息。代码如下:

#include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/semphr.h" #include "freertos/event_groups.h" #include EventGroupHandle_t g_event_group; #define SENDER_BIT BIT0 #define RECEIVER_BIT BIT1 // sender_task void sender_task(void *arg) { int count = 0; while (1) { // 在事件组中设置 SENDER_BIT 标志位,表示有新的数字需要发送 xEventGroupSetBits(g_event_group, SENDER_BIT); count++; // 暂停 1000ms 等待 receiver_task 处理 vTaskDelay(1000 / portTICK_PERIOD_MS); } } // receiver_task void receiver_task(void *arg) { while (1) { // 等待 SENDER_BIT 标志位被设置 EventBits_t bits = xEventGroupWaitBits(g_event_group, SENDER_BIT, pdTRUE, pdFALSE, portMAX_DELAY); if (bits & SENDER_BIT) { printf("Received Count: %d\n", xEventGroupGetBits(g_event_group)); } } } void app_main() { // 创建事件组句柄 g_event_group = xEventGroupCreate(); // 创建 sender_task 和 receiver_task xTaskCreate(sender_task, "sender", 2048, NULL, 5, NULL); xTaskCreate(receiver_task, "receiver", 2048, NULL, 5, NULL); }

在代码中,我们首先创建一个事件组句柄 g_event_group,然后创建 sender_task 和 receiver_task,它们分别通过 xEventGroupSetBits() 和 xEventGroupWaitBits() 操作事件组。

在 sender_task 中,我们使用 xEventGroupSetBits() 设置 SENDER_BIT 标志位,并通过 vTaskDelay() 暂停一秒钟等待 receiver_task 处理。

而在 receiver_task 中,我们不断等待 SENDER_BIT 标志被设置,并在设置后输出收到数字的计数。

通过使用事件组和相关 API,我们可以很容易地实现多任务中的同步和通信,提高程序的可靠性和可维护性。

总之,使用事件组可以使 ESP32 应用程序更加高效和灵活。通过向事件组中添加或删除位,不同的任务可以检测和响应不同的事件,并实现更高效的同步和通信。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有